/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.ces4.produccion.jpa.controllers;

import co.com.ces4.produccion.jpa.controllers.exceptions.NonexistentEntityException;
import co.com.ces4.produccion.jpa.controllers.exceptions.PreexistingEntityException;
import co.com.ces4.produccion.jpa.entities.DetalleOrdenProduccion;
import co.com.ces4.produccion.jpa.entities.DetalleOrdenProduccionPK;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import co.com.ces4.produccion.jpa.entities.OrdenProduccion;
import co.com.ces4.produccion.jpa.entities.DetalleSolicitudProduccion;
import co.com.ces4.produccion.jpa.entities.ArticuloLinea;

/**
 *
 * @author usuario
 */
public class DetalleOrdenProduccionJpaController implements Serializable {

    public DetalleOrdenProduccionJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(DetalleOrdenProduccion detalleOrdenProduccion) throws PreexistingEntityException, Exception {
        if (detalleOrdenProduccion.getDetalleOrdenProduccionPK() == null) {
            detalleOrdenProduccion.setDetalleOrdenProduccionPK(new DetalleOrdenProduccionPK());
        }
        detalleOrdenProduccion.getDetalleOrdenProduccionPK().setNmordenProduccion(detalleOrdenProduccion.getOrdenProduccion().getOrdenProduccionPK().getNmid());
        detalleOrdenProduccion.getDetalleOrdenProduccionPK().setDsarticulo(detalleOrdenProduccion.getDetalleSolicitudProduccion().getDetalleSolicitudProduccionPK().getDsarticulo());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            OrdenProduccion ordenProduccion = detalleOrdenProduccion.getOrdenProduccion();
            if (ordenProduccion != null) {
                ordenProduccion = em.getReference(ordenProduccion.getClass(), ordenProduccion.getOrdenProduccionPK());
                detalleOrdenProduccion.setOrdenProduccion(ordenProduccion);
            }
            DetalleSolicitudProduccion detalleSolicitudProduccion = detalleOrdenProduccion.getDetalleSolicitudProduccion();
            if (detalleSolicitudProduccion != null) {
                detalleSolicitudProduccion = em.getReference(detalleSolicitudProduccion.getClass(), detalleSolicitudProduccion.getDetalleSolicitudProduccionPK());
                detalleOrdenProduccion.setDetalleSolicitudProduccion(detalleSolicitudProduccion);
            }
            ArticuloLinea nmlinea = detalleOrdenProduccion.getNmlinea();
            if (nmlinea != null) {
                nmlinea = em.getReference(nmlinea.getClass(), nmlinea.getArticuloLineaPK());
                detalleOrdenProduccion.setNmlinea(nmlinea);
            }
            em.persist(detalleOrdenProduccion);
            if (ordenProduccion != null) {
                ordenProduccion.getDetalleOrdenProduccionList().add(detalleOrdenProduccion);
                ordenProduccion = em.merge(ordenProduccion);
            }
            if (detalleSolicitudProduccion != null) {
                detalleSolicitudProduccion.getDetalleOrdenProduccionList().add(detalleOrdenProduccion);
                detalleSolicitudProduccion = em.merge(detalleSolicitudProduccion);
            }
            if (nmlinea != null) {
                nmlinea.getDetalleOrdenProduccionList().add(detalleOrdenProduccion);
                nmlinea = em.merge(nmlinea);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findDetalleOrdenProduccion(detalleOrdenProduccion.getDetalleOrdenProduccionPK()) != null) {
                throw new PreexistingEntityException("DetalleOrdenProduccion " + detalleOrdenProduccion + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(DetalleOrdenProduccion detalleOrdenProduccion) throws NonexistentEntityException, Exception {
        detalleOrdenProduccion.getDetalleOrdenProduccionPK().setNmordenProduccion(detalleOrdenProduccion.getOrdenProduccion().getOrdenProduccionPK().getNmid());
        detalleOrdenProduccion.getDetalleOrdenProduccionPK().setDsarticulo(detalleOrdenProduccion.getDetalleSolicitudProduccion().getDetalleSolicitudProduccionPK().getDsarticulo());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            DetalleOrdenProduccion persistentDetalleOrdenProduccion = em.find(DetalleOrdenProduccion.class, detalleOrdenProduccion.getDetalleOrdenProduccionPK());
            OrdenProduccion ordenProduccionOld = persistentDetalleOrdenProduccion.getOrdenProduccion();
            OrdenProduccion ordenProduccionNew = detalleOrdenProduccion.getOrdenProduccion();
            DetalleSolicitudProduccion detalleSolicitudProduccionOld = persistentDetalleOrdenProduccion.getDetalleSolicitudProduccion();
            DetalleSolicitudProduccion detalleSolicitudProduccionNew = detalleOrdenProduccion.getDetalleSolicitudProduccion();
            ArticuloLinea nmlineaOld = persistentDetalleOrdenProduccion.getNmlinea();
            ArticuloLinea nmlineaNew = detalleOrdenProduccion.getNmlinea();
            if (ordenProduccionNew != null) {
                ordenProduccionNew = em.getReference(ordenProduccionNew.getClass(), ordenProduccionNew.getOrdenProduccionPK());
                detalleOrdenProduccion.setOrdenProduccion(ordenProduccionNew);
            }
            if (detalleSolicitudProduccionNew != null) {
                detalleSolicitudProduccionNew = em.getReference(detalleSolicitudProduccionNew.getClass(), detalleSolicitudProduccionNew.getDetalleSolicitudProduccionPK());
                detalleOrdenProduccion.setDetalleSolicitudProduccion(detalleSolicitudProduccionNew);
            }
            if (nmlineaNew != null) {
                nmlineaNew = em.getReference(nmlineaNew.getClass(), nmlineaNew.getArticuloLineaPK());
                detalleOrdenProduccion.setNmlinea(nmlineaNew);
            }
            detalleOrdenProduccion = em.merge(detalleOrdenProduccion);
            if (ordenProduccionOld != null && !ordenProduccionOld.equals(ordenProduccionNew)) {
                ordenProduccionOld.getDetalleOrdenProduccionList().remove(detalleOrdenProduccion);
                ordenProduccionOld = em.merge(ordenProduccionOld);
            }
            if (ordenProduccionNew != null && !ordenProduccionNew.equals(ordenProduccionOld)) {
                ordenProduccionNew.getDetalleOrdenProduccionList().add(detalleOrdenProduccion);
                ordenProduccionNew = em.merge(ordenProduccionNew);
            }
            if (detalleSolicitudProduccionOld != null && !detalleSolicitudProduccionOld.equals(detalleSolicitudProduccionNew)) {
                detalleSolicitudProduccionOld.getDetalleOrdenProduccionList().remove(detalleOrdenProduccion);
                detalleSolicitudProduccionOld = em.merge(detalleSolicitudProduccionOld);
            }
            if (detalleSolicitudProduccionNew != null && !detalleSolicitudProduccionNew.equals(detalleSolicitudProduccionOld)) {
                detalleSolicitudProduccionNew.getDetalleOrdenProduccionList().add(detalleOrdenProduccion);
                detalleSolicitudProduccionNew = em.merge(detalleSolicitudProduccionNew);
            }
            if (nmlineaOld != null && !nmlineaOld.equals(nmlineaNew)) {
                nmlineaOld.getDetalleOrdenProduccionList().remove(detalleOrdenProduccion);
                nmlineaOld = em.merge(nmlineaOld);
            }
            if (nmlineaNew != null && !nmlineaNew.equals(nmlineaOld)) {
                nmlineaNew.getDetalleOrdenProduccionList().add(detalleOrdenProduccion);
                nmlineaNew = em.merge(nmlineaNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                DetalleOrdenProduccionPK id = detalleOrdenProduccion.getDetalleOrdenProduccionPK();
                if (findDetalleOrdenProduccion(id) == null) {
                    throw new NonexistentEntityException("The detalleOrdenProduccion with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(DetalleOrdenProduccionPK id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            DetalleOrdenProduccion detalleOrdenProduccion;
            try {
                detalleOrdenProduccion = em.getReference(DetalleOrdenProduccion.class, id);
                detalleOrdenProduccion.getDetalleOrdenProduccionPK();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The detalleOrdenProduccion with id " + id + " no longer exists.", enfe);
            }
            OrdenProduccion ordenProduccion = detalleOrdenProduccion.getOrdenProduccion();
            if (ordenProduccion != null) {
                ordenProduccion.getDetalleOrdenProduccionList().remove(detalleOrdenProduccion);
                ordenProduccion = em.merge(ordenProduccion);
            }
            DetalleSolicitudProduccion detalleSolicitudProduccion = detalleOrdenProduccion.getDetalleSolicitudProduccion();
            if (detalleSolicitudProduccion != null) {
                detalleSolicitudProduccion.getDetalleOrdenProduccionList().remove(detalleOrdenProduccion);
                detalleSolicitudProduccion = em.merge(detalleSolicitudProduccion);
            }
            ArticuloLinea nmlinea = detalleOrdenProduccion.getNmlinea();
            if (nmlinea != null) {
                nmlinea.getDetalleOrdenProduccionList().remove(detalleOrdenProduccion);
                nmlinea = em.merge(nmlinea);
            }
            em.remove(detalleOrdenProduccion);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<DetalleOrdenProduccion> findDetalleOrdenProduccionEntities() {
        return findDetalleOrdenProduccionEntities(true, -1, -1);
    }

    public List<DetalleOrdenProduccion> findDetalleOrdenProduccionEntities(int maxResults, int firstResult) {
        return findDetalleOrdenProduccionEntities(false, maxResults, firstResult);
    }

    private List<DetalleOrdenProduccion> findDetalleOrdenProduccionEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(DetalleOrdenProduccion.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public DetalleOrdenProduccion findDetalleOrdenProduccion(DetalleOrdenProduccionPK id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(DetalleOrdenProduccion.class, id);
        } finally {
            em.close();
        }
    }

    public int getDetalleOrdenProduccionCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<DetalleOrdenProduccion> rt = cq.from(DetalleOrdenProduccion.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
